Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


src/display/ST7789.h HEAD (a42f8d32) Text, 13.01 KB

T8b949e/**
* The MIT License (MIT)
*
* Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
* Copyright (c) 2018 by Fabrice Weinberg
* Copyright (c) 2024 by Heltec AutoMation
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* ThingPulse invests considerable time and money to develop these open source libraries.
* Please support us by buying our products (and not the clones) from
* https://thingpulse.com
*
*/

Tff7b72#Tff7b72ifndef ST7789Spi_h
Tff7b72#Tff7b72define ST7789Spi_h

Tff7b72#Tff7b72include T8b949e"OLEDDisplay.h"
Tff7b72#Tff7b72include T8b949e<SPI.h>


Tff7b72#Tff7b72define ST_CMD_DELAY 0x80 T8b949e// special signifier for command lists

Tff7b72#Tff7b72define ST77XX_NOP 0x00
Tff7b72#Tff7b72define ST77XX_SWRESET 0x01
Tff7b72#Tff7b72define ST77XX_RDDID 0x04
Tff7b72#Tff7b72define ST77XX_RDDST 0x09

Tff7b72#Tff7b72define ST77XX_SLPIN 0x10
Tff7b72#Tff7b72define ST77XX_SLPOUT 0x11
Tff7b72#Tff7b72define ST77XX_PTLON 0x12
Tff7b72#Tff7b72define ST77XX_NORON 0x13

Tff7b72#Tff7b72define ST77XX_INVOFF 0x20
Tff7b72#Tff7b72define ST77XX_INVON 0x21
Tff7b72#Tff7b72define ST77XX_DISPOFF 0x28
Tff7b72#Tff7b72define ST77XX_DISPON 0x29
Tff7b72#Tff7b72define ST77XX_CASET 0x2A
Tff7b72#Tff7b72define ST77XX_RASET 0x2B
Tff7b72#Tff7b72define ST77XX_RAMWR 0x2C
Tff7b72#Tff7b72define ST77XX_RAMRD 0x2E

Tff7b72#Tff7b72define ST77XX_PTLAR 0x30
Tff7b72#Tff7b72define ST77XX_TEOFF 0x34
Tff7b72#Tff7b72define ST77XX_TEON 0x35
Tff7b72#Tff7b72define ST77XX_MADCTL 0x36
Tff7b72#Tff7b72define ST77XX_COLMOD 0x3A

Tff7b72#Tff7b72define ST77XX_MADCTL_MY 0x80
Tff7b72#Tff7b72define ST77XX_MADCTL_MX 0x40
Tff7b72#Tff7b72define ST77XX_MADCTL_MV 0x20
Tff7b72#Tff7b72define ST77XX_MADCTL_ML 0x10
Tff7b72#Tff7b72define ST77XX_MADCTL_RGB 0x00

Tff7b72#Tff7b72define ST77XX_RDID1 0xDA
Tff7b72#Tff7b72define ST77XX_RDID2 0xDB
Tff7b72#Tff7b72define ST77XX_RDID3 0xDC
Tff7b72#Tff7b72define ST77XX_RDID4 0xDD

T8b949e// Some ready-made 16-bit ('565') color settings:
Tff7b72#Tff7b72define ST77XX_BLACK 0x0000
Tff7b72#Tff7b72define ST77XX_WHITE 0xFFFF
Tff7b72#Tff7b72define ST77XX_RED 0xF800
Tff7b72#Tff7b72define ST77XX_GREEN 0x07E0
Tff7b72#Tff7b72define ST77XX_BLUE 0x001F
Tff7b72#Tff7b72define ST77XX_CYAN 0x07FF
Tff7b72#Tff7b72define ST77XX_MAGENTA 0xF81F
Tff7b72#Tff7b72define ST77XX_YELLOW 0xFFE0
Tff7b72#Tff7b72define ST77XX_ORANGE 0xFC00

Tff7b72#Tff7b72define LED_A_ON LOW

Tff7b72#Tff7b72ifdef ESP_PLATFORM
Tff7b72#Tff7b72undef LED_A_ON
Tff7b72#Tff7b72define LED_A_ON HIGH
Tff7b72#Tff7b72define rtos_free free
Tff7b72#Tff7b72define rtos_malloc malloc
T8b949e//SPIClass SPI1(HSPI);
Tff7b72#Tff7b72endif
Te6edf3class Te6edf3ST7789Spi Tff7b72: Te6edf3public Te6edf3OLEDDisplay Tb4b4b4{
Te6edf3privateTff7b72:
Tffa657uint8_t Te6edf3_rstTb4b4b4;
Tffa657uint8_t Te6edf3_dcTb4b4b4;
Tffa657uint8_t Te6edf3_csTb4b4b4;
Tffa657uint8_t Te6edf3_ledATb4b4b4;
Tffa657int Te6edf3_misoTb4b4b4;
Tffa657int Te6edf3_mosiTb4b4b4;
Tffa657int Te6edf3_clkTb4b4b4;
Te6edf3SPIClass Tff7b72* Te6edf3_spiTb4b4b4;
Te6edf3SPISettings Te6edf3_spiSettingsTb4b4b4;
Tffa657uint16_t Te6edf3_RGBTff7b72=T79c0ff0xFFFFTb4b4b4;
Tffa657uint8_t Te6edf3_buffheightTb4b4b4;
Te6edf3publicTff7b72:
T8b949e/* pass _cs as -1 to indicate "do not use CS pin", for cases where it is hard wired low */
Te6edf3ST7789SpiTb4b4b4(Te6edf3SPIClass Tff7b72*Te6edf3spiClassTb4b4b4,Tffa657uint8_t Te6edf3_rstTb4b4b4, Tffa657uint8_t Te6edf3_dcTb4b4b4, Tffa657uint8_t Te6edf3_csTb4b4b4, Te6edf3OLEDDISPLAY_GEOMETRY Te6edf3g Tff7b72= Te6edf3GEOMETRY_RAWMODETb4b4b4,Tffa657uint16_t Te6edf3widthTff7b72=T79c0ff240Tb4b4b4,Tffa657uint16_t Te6edf3heightTff7b72=T79c0ff320Tb4b4b4,Tffa657int Te6edf3mosiTff7b72=T79c0ff-1Tb4b4b4,Tffa657int Te6edf3misoTff7b72=T79c0ff-1Tb4b4b4,Tffa657int Te6edf3clkTff7b72=T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3thisTff7b72-Tff7b72>Te6edf3_spi Tff7b72= Te6edf3spiClassTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_rst Tff7b72= Te6edf3_rstTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_dc Tff7b72= Te6edf3_dcTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_cs Tff7b72= Te6edf3_csTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_mosiTff7b72=Te6edf3mosiTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_misoTff7b72=Te6edf3misoTb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_clkTff7b72=Te6edf3clkTb4b4b4;
T8b949e//this->_ledA = _ledA;
Te6edf3_spiSettings Tff7b72= Te6edf3SPISettingsTb4b4b4(T79c0ff40000000Tb4b4b4, Te6edf3MSBFIRSTTb4b4b4, Te6edf3SPI_MODE0Tb4b4b4)Tb4b4b4;
Te6edf3setGeometryTb4b4b4(Te6edf3gTb4b4b4,Te6edf3widthTb4b4b4,Te6edf3heightTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657bool Te6edf3connectTb4b4b4(Tb4b4b4)Tb4b4b4{
Te6edf3thisTff7b72-Tff7b72>Te6edf3_buffheightTff7b72=Te6edf3displayHeight Tff7b72/ T79c0ff8Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3_buffheightTff7b72+Tff7b72=Te6edf3displayHeight Tff7b72% T79c0ff8 Tff7b72? T79c0ff1Tff7b72:T79c0ff0Tb4b4b4;
Te6edf3pinModeTb4b4b4(Te6edf3_csTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Te6edf3pinModeTb4b4b4(Te6edf3_dcTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
T8b949e//pinMode(_ledA, OUTPUT);
Tff7b72if Tb4b4b4(Te6edf3_cs Tff7b72!Tff7b72= Tb4b4b4(Tffa657uint8_tTb4b4b4) T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3pinModeTb4b4b4(Te6edf3_csTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3pinModeTb4b4b4(Te6edf3_rstTb4b4b4, Te6edf3OUTPUTTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72ifdef ESP_PLATFORM
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Te6edf3_clkTb4b4b4,Te6edf3_misoTb4b4b4,Te6edf3_mosiTb4b4b4,T79c0ff-1Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3_spiTff7b72-Tff7b72>Te6edf3setClockDivider Tb4b4b4(Te6edf3SPI_CLOCK_DIV2Tb4b4b4)Tb4b4b4;

T8b949e// Pulse Reset low for 10ms
Te6edf3digitalWriteTb4b4b4(Te6edf3_rstTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_rstTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_rstTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3begin Tb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e//digitalWrite(_ledA, LED_A_ON);
Tff7b72return Tffa657trueTb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3displayTb4b4b4(Tffa657voidTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72ifdef OLEDDISPLAY_DOUBLE_BUFFER

Tffa657uint16_t Te6edf3minBoundY Tff7b72= Te6edf3UINT16_MAXTb4b4b4;
Tffa657uint16_t Te6edf3maxBoundY Tff7b72= T79c0ff0Tb4b4b4;

Tffa657uint16_t Te6edf3minBoundX Tff7b72= Te6edf3UINT16_MAXTb4b4b4;
Tffa657uint16_t Te6edf3maxBoundX Tff7b72= T79c0ff0Tb4b4b4;

Tffa657uint16_t Te6edf3xTb4b4b4, Te6edf3yTb4b4b4;
T8b949e// Calculate the Y bounding box of changes
T8b949e// and copy buffer[pos] to buffer_back[pos];
Tff7b72for Tb4b4b4(Te6edf3y Tff7b72= T79c0ff0Tb4b4b4; Te6edf3y Tff7b72< Te6edf3_buffheightTb4b4b4; Te6edf3yTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3x Tff7b72= T79c0ff0Tb4b4b4; Te6edf3x Tff7b72< Te6edf3displayWidthTb4b4b4; Te6edf3xTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
T8b949e//Serial.printf("x %d y %d\r\n",x,y);
Tffa657uint16_t Te6edf3pos Tff7b72= Te6edf3x Tff7b72+ Te6edf3y Tff7b72* Te6edf3displayWidthTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3posTb4b4b4] Tff7b72!Tff7b72= Te6edf3buffer_backTb4b4b4[Te6edf3posTb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3minBoundY Tff7b72= Te6edf3minTb4b4b4(Te6edf3minBoundYTb4b4b4, Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3maxBoundY Tff7b72= Te6edf3maxTb4b4b4(Te6edf3maxBoundYTb4b4b4, Te6edf3yTb4b4b4)Tb4b4b4;
Te6edf3minBoundX Tff7b72= Te6edf3minTb4b4b4(Te6edf3minBoundXTb4b4b4, Te6edf3xTb4b4b4)Tb4b4b4;
Te6edf3maxBoundX Tff7b72= Te6edf3maxTb4b4b4(Te6edf3maxBoundXTb4b4b4, Te6edf3xTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3buffer_backTb4b4b4[Te6edf3posTb4b4b4] Tff7b72= Te6edf3bufferTb4b4b4[Te6edf3posTb4b4b4]Tb4b4b4;
Tb4b4b4}
Te6edf3yieldTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// If the minBoundY wasn't updated
T8b949e// we can savely assume that buffer_back[pos] == buffer[pos]
T8b949e// holdes true for all values of pos
Tff7b72if Tb4b4b4(Te6edf3minBoundY Tff7b72=Tff7b72= Te6edf3UINT16_MAXTb4b4b4) Tff7b72returnTb4b4b4;

Te6edf3set_CSTb4b4b4(Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;

Tff7b72for Tb4b4b4(Te6edf3y Tff7b72= Te6edf3minBoundYTb4b4b4; Te6edf3y Tff7b72<Tff7b72= Te6edf3maxBoundYTb4b4b4; Te6edf3yTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Tff7b72forTb4b4b4(Tffa657int Te6edf3temp Tff7b72= T79c0ff0Tb4b4b4; Te6edf3tempTff7b72<T79c0ff8Tb4b4b4;Te6edf3tempTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
T8b949e//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
Te6edf3setAddrWindowTb4b4b4(Te6edf3minBoundXTb4b4b4,Te6edf3yTff7b72*T79c0ff8Tff7b72+Te6edf3tempTb4b4b4,Te6edf3maxBoundXTff7b72-Te6edf3minBoundXTff7b72+T79c0ff1Tb4b4b4,T79c0ff1Tb4b4b4)Tb4b4b4;
T8b949e//setAddrWindow(y*8+temp,minBoundX,1,maxBoundX-minBoundX+1);
Tffa657uint32_t Tff7b72const Te6edf3pixbufcount Tff7b72= Te6edf3maxBoundXTff7b72-Te6edf3minBoundXTff7b72+T79c0ff1Tb4b4b4;
Tffa657uint16_t Tff7b72*Te6edf3pixbuf Tff7b72= Tb4b4b4(Tffa657uint16_t Tff7b72*Tb4b4b4)Te6edf3rtos_mallocTb4b4b4(T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3x Tff7b72= Te6edf3minBoundXTb4b4b4; Te6edf3x Tff7b72<Tff7b72= Te6edf3maxBoundXTb4b4b4; Te6edf3xTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3pixbufTb4b4b4[Te6edf3xTff7b72-Te6edf3minBoundXTb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3x Tff7b72+ Te6edf3y Tff7b72* Te6edf3displayWidthTb4b4b4]Tff7b72>Tff7b72>Te6edf3tempTb4b4b4)Tff7b72&T79c0ff0x01Tb4b4b4)Tff7b72=Tff7b72=T79c0ff1Tff7b72?Te6edf3_RGBTff7b72:T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72ifdef ESP_PLATFORM
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferBytesTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4)Te6edf3pixbufTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3pixbufTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3rtos_freeTb4b4b4(Te6edf3pixbufTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72else
Te6edf3set_CSTb4b4b4(Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Tffa657uint8_t Te6edf3xTb4b4b4, Te6edf3yTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3y Tff7b72= T79c0ff0Tb4b4b4; Te6edf3y Tff7b72< Te6edf3_buffheightTb4b4b4; Te6edf3yTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Tff7b72forTb4b4b4(Tffa657int Te6edf3temp Tff7b72= T79c0ff0Tb4b4b4; Te6edf3tempTff7b72<T79c0ff8Tb4b4b4;Te6edf3tempTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
T8b949e//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
T8b949e//setAddrWindow(minBoundX,y*8+temp,maxBoundX-minBoundX+1,1);
Te6edf3setAddrWindowTb4b4b4(Te6edf3yTff7b72*T79c0ff8Tff7b72+Te6edf3tempTb4b4b4,T79c0ff0Tb4b4b4,T79c0ff1Tb4b4b4,Te6edf3displayWidthTb4b4b4)Tb4b4b4;
Tffa657uint32_t Tff7b72const Te6edf3pixbufcount Tff7b72= Te6edf3displayWidthTb4b4b4;
Tffa657uint16_t Tff7b72*Te6edf3pixbuf Tff7b72= Tb4b4b4(Tffa657uint16_t Tff7b72*Tb4b4b4)Te6edf3rtos_mallocTb4b4b4(T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3x Tff7b72= T79c0ff0Tb4b4b4; Te6edf3x Tff7b72< Te6edf3displayWidthTb4b4b4; Te6edf3xTff7b72+Tff7b72+Tb4b4b4)
Tb4b4b4{
Te6edf3pixbufTb4b4b4[Te6edf3xTb4b4b4] Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3bufferTb4b4b4[Te6edf3x Tff7b72+ Te6edf3y Tff7b72* Te6edf3displayWidthTb4b4b4]Tff7b72>Tff7b72>Te6edf3tempTb4b4b4)Tff7b72&T79c0ff0x01Tb4b4b4)Tff7b72=Tff7b72=T79c0ff1Tff7b72?Te6edf3_RGBTff7b72:T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72ifdef ESP_PLATFORM
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferBytesTb4b4b4(Tb4b4b4(Tffa657uint8_t Tff7b72*Tb4b4b4)Te6edf3pixbufTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3pixbufTb4b4b4, Tffa657NULLTb4b4b4, T79c0ff2 Tff7b72* Te6edf3pixbufcountTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3rtos_freeTb4b4b4(Te6edf3pixbufTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72endif
Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3resetOrientationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MXTb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3virtual Tffa657void Te6edf3flipScreenVerticallyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MYTb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3virtual Tffa657void Te6edf3mirrorScreenTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MXTff7b72|Te6edf3ST77XX_MADCTL_MYTb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3virtual Tffa657void Te6edf3setRotationTb4b4b4(Tffa657uint8_t Te6edf3rTb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MXTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{ Te6edf3madctl Tff7b72= T79c0ff0xC0Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72=Tff7b72= T79c0ff2Tb4b4b4) Tb4b4b4{ Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MYTb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3r Tff7b72=Tff7b72= T79c0ff3Tb4b4b4) Tb4b4b4{ Te6edf3madctl Tff7b72= T79c0ff0x00Tb4b4b4; Tb4b4b4}
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tffa657void Te6edf3setRGBTb4b4b4(Tffa657uint16_t Te6edf3cTb4b4b4)
Tb4b4b4{

Te6edf3thisTff7b72-Tff7b72>Te6edf3_RGBTff7b72=T79c0ff0x00Tff7b72|Te6edf3cTff7b72>Tff7b72>T79c0ff8Tff7b72|Te6edf3cTff7b72<Tff7b72<T79c0ff8Tff7b72&T79c0ff0xFF00Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3displayOnTb4b4b4(Tffa657voidTb4b4b4) Tb4b4b4{
T8b949e//sendCommand(DISPLAYON);
Tb4b4b4}

Tffa657void Te6edf3displayOffTb4b4b4(Tffa657voidTb4b4b4) Tb4b4b4{
T8b949e//sendCommand(DISPLAYOFF);
Tb4b4b4}
T8b949e//#define ST77XX_MADCTL_MY 0x80
T8b949e//#define ST77XX_MADCTL_MX 0x40
T8b949e//#define ST77XX_MADCTL_MV 0x20
T8b949e//#define ST77XX_MADCTL_ML 0x10
Te6edf3protectedTff7b72:
T8b949e// Send all the init commands
Te6edf3virtual Tffa657void Te6edf3sendInitCommandsTb4b4b4(Tb4b4b4)
Tb4b4b4{
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_SWRESETTb4b4b4)Tb4b4b4; T8b949e// 1: Software reset, no args, w/delay
Te6edf3delayTb4b4b4(T79c0ff150Tb4b4b4)Tb4b4b4;

Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_SLPOUTTb4b4b4)Tb4b4b4; T8b949e// 2: Out of sleep mode, no args, w/delay
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;

Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_COLMODTb4b4b4)Tb4b4b4; T8b949e// 3: Set color mode, 16-bit color
Te6edf3WriteDataTb4b4b4(T79c0ff0x55Tb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4; T8b949e// 4: Mem access ctrl (directions), Row/col addr, bottom-top refresh
Te6edf3WriteDataTb4b4b4(T79c0ff0x08Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_CASETTb4b4b4)Tb4b4b4; T8b949e// 5: Column addr set,
Te6edf3WriteDataTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4; T8b949e// XSTART = 0
Te6edf3WriteDataTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(T79c0ff240Tb4b4b4)Tb4b4b4; T8b949e// XEND = 240
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_RASETTb4b4b4)Tb4b4b4; T8b949e// 6: Row addr set,
Te6edf3WriteDataTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(T79c0ff0x00Tb4b4b4)Tb4b4b4; T8b949e// YSTART = 0
Te6edf3WriteDataTb4b4b4(T79c0ff320Tff7b72>Tff7b72>T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(T79c0ff320Tff7b72&T79c0ff0xFFTb4b4b4)Tb4b4b4; T8b949e// YSTART = 320
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_SLPOUTTb4b4b4)Tb4b4b4; T8b949e// 7: hack
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_NORONTb4b4b4)Tb4b4b4; T8b949e// 8: Normal display on, no args, w/delay
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_DISPONTb4b4b4)Tb4b4b4; T8b949e// 9: Main screen turn on, no args, delay
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;

Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_INVONTb4b4b4)Tb4b4b4; T8b949e// 10: invert
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;

T8b949e//uint8_t madctl = ST77XX_MADCTL_RGB|ST77XX_MADCTL_MX;
Tffa657uint8_t Te6edf3madctl Tff7b72= Te6edf3ST77XX_MADCTL_RGBTff7b72|Te6edf3ST77XX_MADCTL_MVTff7b72|Te6edf3ST77XX_MADCTL_MXTb4b4b4;
Te6edf3sendCommandTb4b4b4(Te6edf3ST77XX_MADCTLTb4b4b4)Tb4b4b4;
Te6edf3WriteDataTb4b4b4(Te6edf3madctlTb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff10Tb4b4b4)Tb4b4b4;
Te6edf3setRGBTb4b4b4(Te6edf3ST77XX_GREENTb4b4b4)Tb4b4b4;
Tb4b4b4}


Te6edf3privateTff7b72:

Tffa657void Te6edf3setAddrWindowTb4b4b4(Tffa657uint16_t Te6edf3xTb4b4b4, Tffa657uint16_t Te6edf3yTb4b4b4, Tffa657uint16_t Te6edf3wTb4b4b4, Tffa657uint16_t Te6edf3hTb4b4b4) Tb4b4b4{
Te6edf3x Tff7b72+Tff7b72= Tb4b4b4(T79c0ff320Tff7b72-Te6edf3displayWidthTb4b4b4)Tff7b72/T79c0ff2Tb4b4b4;
Te6edf3y Tff7b72+Tff7b72= Tb4b4b4(T79c0ff240Tff7b72-Te6edf3displayHeightTb4b4b4)Tff7b72/T79c0ff2Tb4b4b4;
Tffa657uint32_t Te6edf3xa Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3x Tff7b72<Tff7b72< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3x Tff7b72+ Te6edf3w Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3ya Tff7b72= Tb4b4b4(Tb4b4b4(Tffa657uint32_tTb4b4b4)Te6edf3y Tff7b72<Tff7b72< T79c0ff16Tb4b4b4) Tff7b72| Tb4b4b4(Te6edf3y Tff7b72+ Te6edf3h Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_CASETTb4b4b4)Tb4b4b4; T8b949e// Column addr set
Te6edf3SPI_WRITE32Tb4b4b4(Te6edf3xaTb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_RASETTb4b4b4)Tb4b4b4; T8b949e// Row addr set
Te6edf3SPI_WRITE32Tb4b4b4(Te6edf3yaTb4b4b4)Tb4b4b4;

Te6edf3writeCommandTb4b4b4(Te6edf3ST77XX_RAMWRTb4b4b4)Tb4b4b4; T8b949e// write to RAM
Tb4b4b4}
Tffa657int Te6edf3getBufferOffsetTb4b4b4(Tffa657voidTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72inline Tffa657void Te6edf3set_CSTb4b4b4(Tffa657bool Te6edf3levelTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3_cs Tff7b72!Tff7b72= Tb4b4b4(Tffa657uint8_tTb4b4b4) T79c0ff-1Tb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_csTb4b4b4, Te6edf3levelTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72inline Tffa657void Td2a8ffsendCommandTb4b4b4(Tffa657uint8_t Te6edf3comTb4b4b4) Te6edf3__attribute__Tb4b4b4(Tb4b4b4(Te6edf3always_inlineTb4b4b4)Tb4b4b4)Tb4b4b4{
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_dcTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3comTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3set_CSTb4b4b4(Te6edf3HIGHTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_dcTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72inline Tffa657void Td2a8ffWriteDataTb4b4b4(Tffa657uint8_t Te6edf3dataTb4b4b4) Te6edf3__attribute__Tb4b4b4(Tb4b4b4(Te6edf3always_inlineTb4b4b4)Tb4b4b4)Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_csTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3beginTransactionTb4b4b4(Te6edf3_spiSettingsTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3endTransactionTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_csTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffSPI_WRITE32Tb4b4b4(Tffa657uint32_t Te6edf3lTb4b4b4)
Tb4b4b4{
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff24Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff16Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3l Tff7b72>Tff7b72> T79c0ff8Tb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3lTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffwriteCommandTb4b4b4(Tffa657uint8_t Te6edf3cmdTb4b4b4) Tb4b4b4{
Te6edf3digitalWriteTb4b4b4(Te6edf3_dcTb4b4b4, Te6edf3LOWTb4b4b4)Tb4b4b4;
Te6edf3_spiTff7b72-Tff7b72>Te6edf3transferTb4b4b4(Te6edf3cmdTb4b4b4)Tb4b4b4;
Te6edf3digitalWriteTb4b4b4(Te6edf3_dcTb4b4b4, Te6edf3HIGHTb4b4b4)Tb4b4b4;
Tb4b4b4}

T8b949e// Private functions
Tffa657void Td2a8ffsetGeometryTb4b4b4(Te6edf3OLEDDISPLAY_GEOMETRY Te6edf3gTb4b4b4, Tffa657uint16_t Te6edf3widthTb4b4b4, Tffa657uint16_t Te6edf3heightTb4b4b4) Tb4b4b4{
Te6edf3thisTff7b72-Tff7b72>Te6edf3geometry Tff7b72= Te6edf3gTb4b4b4;

Tff7b72switch Tb4b4b4(Te6edf3gTb4b4b4) Tb4b4b4{
Tff7b72case Tff7b72GEOMETRY_128_128Tb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= T79c0ff128Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= T79c0ff128Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case Tff7b72GEOMETRY_128_64Tb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= T79c0ff128Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= T79c0ff64Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case Tff7b72GEOMETRY_128_32Tb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= T79c0ff128Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= T79c0ff32Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case Tff7b72GEOMETRY_64_48Tb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= T79c0ff64Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= T79c0ff48Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case Tff7b72GEOMETRY_64_32Tb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= T79c0ff64Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= T79c0ff32Tb4b4b4;
Tff7b72breakTb4b4b4;
Tff7b72case Tff7b72GEOMETRY_RAWMODETb4b4b4:
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayWidth Tff7b72= Te6edf3width Tff7b72> T79c0ff0 Tff7b72? Te6edf3width Tff7b72: T79c0ff128Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayHeight Tff7b72= Te6edf3height Tff7b72> T79c0ff0 Tff7b72? Te6edf3height Tff7b72: T79c0ff64Tb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tffa657uint8_t Te6edf3tmpTff7b72=Te6edf3displayHeight Tff7b72% T79c0ff8Tb4b4b4;
Tffa657uint8_t Te6edf3_buffheightTff7b72=Te6edf3displayHeight Tff7b72/ T79c0ff8Tb4b4b4;

Tff7b72ifTb4b4b4(Te6edf3tmpTff7b72!Tff7b72=T79c0ff0Tb4b4b4)
Te6edf3_buffheightTff7b72+Tff7b72+Tb4b4b4;
Te6edf3thisTff7b72-Tff7b72>Te6edf3displayBufferSize Tff7b72= Te6edf3displayWidth Tff7b72* Te6edf3_buffheight Tb4b4b4;
Tb4b4b4}


Tb4b4b4}Tb4b4b4;

Tff7b72#Tff7b72endif


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────